一覧に戻る

AWS CDKでCloudfront - Lambda FunctionURLsのOACを定義する

#AWS#TypeScript#CloudFront#lambda#CDK

以前の記事

https://qiita.com/Kanahiro/items/85573c9ae724df435a6a

TL;DR

import * as iam from 'aws-cdk-lib/aws-iam';
import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
import * as lambda from 'aws-cdk-lib/aws-lambda';

// 以下のようなリソースが定義されているとして(当然このままでは動かない)
const distribution = new cloudfront.Distribution({hoge:fuga});
const lambdaFunc = new lambda.DockerImageFunction({{hoge:fuga}};
const funcUrl = lambdaFunc.addFunctionUrl({
    authType: lambda.FunctionUrlAuthType.AWS_IAM
});

// Cfn Constructを参照
const cfnDistribution = distribution.node.defaultChild as cloudfront.CfnDistribution;

// OAC設定: Cloudfront側
const cfnOriginAccessControl = new cloudfront.CfnOriginAccessControl(
    this,
    'OriginAccessControl',
    {
        originAccessControlConfig: {
            name: 'oac-lambda',
            originAccessControlOriginType: 'lambda',
            signingBehavior: 'always',
            signingProtocol: 'sigv4',
            description: 'Access Control'
        }
    }
);
cfnDistribution.addPropertyOverride(
    // CloudfrontのオリジンにFunction Urlが設定されていて、0=lambdaの場合
    'DistributionConfig.Origins.0.OriginAccessControlId',
    cfnOriginAccessControl.attrId
);

// OAC設定: Lambda側
lambdaFunc.addPermission('allowCf', {
    action: 'lambda:InvokeFunctionUrl',
    principal: new iam.ServicePrincipal('cloudfront.amazonaws.com'),
    sourceArn: `arn:aws:cloudfront::${this.account}:distribution/${distribution.distributionId}`
});

参考

https://github.com/aws/aws-cdk/issues/21771

L2 ConstructではOACは未実装で、2022年からIssueが立っている。we are actively workingというコントリビュータがおられるので、そのうちもっと簡素に書けるようになるかもしれない。